package com.atguigu.gmall.feign.product;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.product.to.CategoryTree;
import feign.Request;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * @author lfy
 * @Description
 * @create 2023-08-18 13:55
 */
@RequestMapping("/api/inner/product")
@FeignClient(value = "service-product")
//feign自己去注册中心找到 service-product 的真正地址
//service-product 两次含义：
//1）、需要远程调用的服务名是哪个
//2）、作为当前feign客户端的 客户端的配置名（超时、容错、重试）；
//如果 value重名了。三种办法：
//1)、配置文件允许Bean定义信息重写
//2）、每个人指定唯一的 contextId
//3)、将某个服务暴露的所有远程接口，都放到一个FeignClient类中进行集中式管理（缺点：代码多不好看  优点：集中管理维护容易）
public interface CategoryFeignClient {


    /**
     * feign: 声明式客户端； 自动给指定位置发请求，自动把响应数据转成我们想要的类型
     * 同一套API，两处不同用法
     * @GetMapping： controller  代表接受一个get形式的请求
     * @GetMapping： feignclient 代表发送一个get形式的请求
     * @RequestParam: controller  代表从请求参数中获取数据
     * @RequestParam: feignclient  代表把方法传入的参数放到请求参数位置，并用指定的参数名
     * @RequestBody: controller  代表从请求体中获取数据，并转为指定的对象
     * @RequestBody: feignclient  代表把方法传入的对象转为json，放到请求体，把请求发出去
     * @RequestHeader： controller  代表从请求头中获取数据
     * @RequestHeader： feignclient  代表把方法传入的参数放到请求头
     * 方法返回值：
     *
     * @Param Request.Options 自行设置当次请求的超时时间等，如果不设置就用默认的【配置文件的，配置文件没有就用默认1s的】。
     * @return
     */
//    @GetMapping("/category/tree") //返回值写一个能兼容返回的json字符串数据格式的类型
//    Result<List<CategoryTree>> getCategoryTreeData(Request.Options options);


    @GetMapping("/category/tree") //返回值写一个能兼容返回的json字符串数据格式的类型
    Result<List<CategoryTree>> getCategoryTreeData();
}
